package com.ww.juc.completable.future.multi.task;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * applyToEditor、acceptEither和runAfterEither
 * 这三个方法和上面一样也是将两个CompletableFuture组合起来处理，当有一个任务正常完成时，就会进入下阶段任务
 * applyToEither会将已经完成任务的执行结果作为所提供函数的参数，且该方法有返回值；
 * acceptEither同样将已经完成任务的执行结果作为方法入参，但是无返回值；
 * runAfterEither没有入参，也没有返回值。
 * @author wanggw
 * 2024年2月5日 下午6:26:36
 */
public class MultiTaskCombineDemo2 {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		testApplyToEither();
	}
	
	public static void testApplyToEither() throws InterruptedException, ExecutionException {
		long startTime = System.currentTimeMillis();
		CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
			System.out.println(Thread.currentThread() + "任务1开始干点啥呢...");
			try {
				TimeUnit.SECONDS.sleep(2L);
				System.out.println(Thread.currentThread() + "任务1睡眠2秒");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			return "任务1已完成啦";
		});
		
		CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> {
			System.out.println(Thread.currentThread() + "任务2开始执行了...");
			try {
				TimeUnit.SECONDS.sleep(5L);
				System.out.println(Thread.currentThread() + "任务2睡眠5秒");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return "任务2执行完成了...";
		});
		
		CompletableFuture<String> cf3 = cf1.applyToEither(cf2, (result) -> {
			System.out.println("接收到" + result);
			System.out.println(Thread.currentThread() + "任务3，又怎么样呢");
			return "任务3执行也完成了";
		});
		
		System.out.println("执行总结果：" + cf3.get() + "，总耗时：" + (System.currentTimeMillis() - startTime) / 1000 + "秒");
		
//		打印结果
//		Thread[ForkJoinPool.commonPool-worker-9,5,main]任务1开始干点啥呢...
//		Thread[ForkJoinPool.commonPool-worker-2,5,main]任务2开始执行了...
//		Thread[ForkJoinPool.commonPool-worker-9,5,main]任务1睡眠2秒
//		接收到任务1已完成啦
//		Thread[ForkJoinPool.commonPool-worker-9,5,main]任务3，又怎么样呢
//		执行总结果：任务3执行也完成了，总耗时：2秒

	}
	
	
	public static void testAcceptEither() {
		
	}
	
	public static void testRunAfterEither() {
		
	}
}
